近幾年來 C# 大為流行,不論是桌面應用、網頁、手機 App 都可見其蹤影,其依賴的是強大的 .Net Framework,因此你肯定有經驗,在安裝某個軟體時,會告訴你「需要安裝 .Net Framework XXXX 版」,當然 .Net 框架不只有 C# 使用,可以參考 wiki 上面有列出使用這套框架的語言。
我們先來談談什麼是 Managed 的程式碼,根據微軟官方文件說明
Managed 程式碼就是其執行受到執行階段管理的程式碼。
在此情況下,不論實作為何 (Mono、.NET Framework 或 .NET Core),所提到的執行階段都稱為 Common Language Runtime 或 CLR。 CLR 負責將 Managed 程式碼編譯成機器碼,再加以執行。
此外,執行階段提供幾項重要服務,例如自動記憶體管理、安全性界限、型別安全等。
舉個例子來說,你使用 C# 寫的程式碼,編譯完後並不會成為機械碼,也就是不能直接執行,此時是編譯為「通用中間語言(MSIL or CIL)」,當你嘗試執行時,會由 CLR 接管,並且執行 JIT 程序將 IL 碼轉換成機械碼,此時才能真正的執行。但跟 Java 的 Bytecode 有點不同。
然而,使用 .Net Framework 開發的 DLL 也因為會需要使用到 .Net Framework,對於一些 Native Code 的語言(如:MFC, Visual C++)並沒辦法直接使用。當你在這些平台開發時,有時會因為其封裝的 API 太少,會想用 C# 來寫一些功能,尤其是 C# 在網路上有很多開源的函式可以使用,這時候將 Managed DLL 轉成 Unmanaged DLL 就有其必要性了。
網路上有幾篇教學,教你設定 Visual Studio 使其能夠正常的輸出 Unmanaged DLL,不過不知道是我在這方面比較沒經驗,還是因為版本不同的關係,都沒辦法成功輸出 Unmanaged 版本。
後來發現 GitHub 上有個開源的 .NET DLL 輸出工具「DllExport」,其使用方式非常簡單,官方有附上影片教學。
基本上就是將下載下來的DllExport.bat
放到專案目錄,執行後挑選適合你的選項接著按下「Apply」即可,此時會在你的專案中注入一些東西。若你的 Visual Studio 是開著的,會出現提示框問你是否要重新載入,選擇「載入解決方案」即可。
這時候就差不多大功告成了,只需要在你想要輸出的 function 前面將上 [DllExport]
即可。
官方範例如下:
[DllExport]
public static int hello(IntPtr ptr)
{
return 0;
}